/**
 * 2*N的管道，列坐标可为负数。
 * 在(1, 0)位置有一只鸡，其他位置有障碍
 * 问要使得鸡跑不出去，最少还需要设添加几个障碍
 * 
 * 最多只要3个障碍即可，即(2, 0)(1, 1)(1, -1)三个位置
 * 分两种情况讨论
 * 1. 堵这三个位置要添加几个障碍
 * 2. 如果不堵这三个位置，则一共需要4个障碍才能堵住，枚举看要添加几个位置
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;


using llt = long long;
using Real = double;
using vi = vector<int>;
using pii = pair<int, int>;

int N;
vector<pii> A;

int f(const set<int> s[]){
    if(s[0].empty() and s[1].empty()) return 2;

    int u = 0, o = 1;
    const auto * so = &s[1];
    for(auto i : s[0]){
        if(so->find(i) != so->end()) return 0;
        if(so->find(i - 1) != so->end()) return 0;
        if(so->find(i + 1) != so->end()) return 0;
    }

    so = &s[0];
    for(auto i : s[1]){
        if(so->find(i) != so->end()) return 0;
        if(so->find(i - 1) != so->end()) return 0;
        if(so->find(i + 1) != so->end()) return 0;
    }
    return 1;
}

int proc(){
    set<int> left[2], right[2];

    int c = 0;
    for(const auto & p : A) {
        if(p.second <= 0) left[p.first - 1].insert(p.second);
        if(p.second >= 0) right[p.first - 1].insert(p.second);

        if(p.first == 2 and p.second == 0) ++c;
        if(p.first == 1 and p.second == -1) ++c;
        if(p.first == 1 and p.second == 1) ++c;
    }
    
    int ans = 3;
    if(c) ans = 3 - c;    
    ans = min(ans, f(left) + f(right));
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N;
        A.assign(N, {});
        for(auto & p : A) cin >> p.first >> p.second;
        cout << proc() << "\n";
    }
    return 0;
}